#include "ota_http.h"
#include <curl/curl.h>
#include <string.h>
#include "log/log.h"
#include <stdlib.h>

// 接收请求响应数据的回调函数
/*
ptr: 响应数据指针
size： 每份数据的大小
nmemb: 数据的份数
data_buf: 初始化时配置的数据容器
*/
size_t receive_callback(void *ptr, size_t size, size_t nmemb, void *data_buf) {
    // 数据的长度
    int data_len = size * nmemb;
    // 将响应数据拷贝到数据容器中
    memcpy(data_buf, ptr, data_len);
    // 添加一个字符串结束符
    ((char *)data_buf)[data_len] = '\0';
    // 返回数据长度
    return data_len;
}

/**
 * @brief 获取json数据
 * 
 * @param url 网址
 * @return char* json数据
 */
char *ota_http_getJson(char *url)
{
    // 创建curl句柄==》目的：向服务器发送最新版本信息请求
    CURL *curl = curl_easy_init();

    // 设置请求的URL   
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_callback);
    // 向回调函数传递一个数据容器
    char *json_buf = malloc(1024);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, json_buf);

    // 执行请求
    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)  {
        log_error("请求失败: %s", url);
        // 释放curl对象
        curl_easy_cleanup(curl);
        return NULL;
    }

    // 释放curl对象
    curl_easy_cleanup(curl);

    return json_buf;

}


/**
 * @brief 下载文件
 * 
 * @param url 网址
 * @param filename 本地文件名
 * @return int 0成功，其他失败
 */
int ota_http_download(char *url, char *filename)
{
    // 创建curl对象
    CURL *curl = curl_easy_init();
    // 设置请求的URL   
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    // 向回调函数传递一个数据容器
    // 将文件写入到本地文件中
    FILE *file = fopen(filename, "wb");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);

    // 执行请求
    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)  {
        log_error("请求失败: %s", url);
        // 释放curl对象
        curl_easy_cleanup(curl);
        // 关闭文件
        fclose(file);
        return -1;
    }

    // 释放curl对象
    curl_easy_cleanup(curl);
    // 关闭文件
    fclose(file);

    return 0;
}